package com.example.week8_storage1;

import android.annotation.SuppressLint;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

/**
 * Created by Administrator on 2022/4/25.
 */



    /*创建LibraryDBHelper类，是为给Activity中调用数据库功能提供更易懂的界面。用专业术语讲，这叫“抽象处理逻辑”，也可以称“隐藏实现细节”，软件工程中降低开发复杂度、保证质量的重要手段。总之，未来Activity中调用数据库功能时，只要使用本类中提供的方法即可，更多的细节就不需要关注了于是，在这个类中，就会调用到底层的一些细节，例如，需要调用SQLiteDatabase类中的方法，最终实现功能。目前，在LibraryDBHelper类中完成了“图书馆管理系统”数据库中部分表的创建，以及对readers表的各种操作，对数据库的升级(Upgrade)、创建其他表，以及实现对其他表的操作，有待学习者自行扩充。*/

    public class LibraryDBHelper extends SQLiteOpenHelper {//数字图书馆数据库版本号

    public static final int DATABASE_VERSION = 1;
    //数字图书馆数据库名
    private static final String DATABASE_NAME = "library.db";
    //数据库中三个最基本的表（读者、图书、借书）的名称
    private static final String READERS = "readers";
    private static final String BOOKS = "books";
    private static final String BORROWS = "borrows";//声明SQLiteDataBase对象
    private SQLiteDatabase sqLiteDatabase;//帮助类的构造函数

    // 这实际上是对父类构造函数的简化，在外部访问定义对象实例时，只需要指定上下文(Context)即可，数据库名、工厂类、版本号可省略
    public LibraryDBHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
       //创建读者表
         String CREATE_READERS="create table readers("+"reader_idintegerprimarykey,"+"reader_numbertext,"+"reader_nametext,"+"reader_typetext,"+"reader_phonetext,"+"reader_passwordtext,"+"reader_createtimetext)";
        sqLiteDatabase.execSQL(CREATE_READERS);

        // 创建图书表
        String CREATE_BOOK = "create table books(" + "book_idintegerprimarykey," + "book_nametext," + "book_authortext," + "book_publishertext," + "book_intimetext," + "book_countsinteger)";
        sqLiteDatabase.execSQL(CREATE_BOOK);

        //创建借阅表
        String BORROW_BOOK = "create table borrowers(" + "book_idintegerprimarykey," + "book_nametext," + "book_authortext," + "book_publishertext," + "book_borrowtimetext," + "book_countsinteger)";
        sqLiteDatabase.execSQL(BORROW_BOOK);


}
          public void insert_reader(Reader reader){
              //定义SQLiteDatabase对象实例
              SQLiteDatabase sqLiteDatabase=getWritableDatabase();//在日志中输出文件位置，可以删除
            //贺老师在调试中用于确定数据库位置时用过，保留下供同学们学习中参考
              Log.d("文件位置",sqLiteDatabase.getPath());
              //用参数Reader对象中的各成员值构造ContentValues对象
              // 以利用SqLiteDatabase对象的insert方法实现操作
              ContentValues values=new ContentValues();
              values.put("reader_number",reader.getReader_number());
              values.put("reader_name",reader.getReader_name());
              values.put("reader_type",reader.getReader_type());
              values.put("reader_phone",reader.getReader_phone());
              values.put("reader_createtime",reader.getReader_createtime());
              values.put("reader_password",reader.getReader_password());
              //调用SqLiteDatabase对象的insert方法实现向数据库的readers表中插入数据//注意：这里体现LibraryDBHelper类将SqLiteDatabase作为底层，调用其方法实现功能sqLiteDatabase.insert("readers",null,values);
              sqLiteDatabase.insert("readers",null,values);
              // 关闭数据库连接
              sqLiteDatabase.close();
          }
          //删除读者
// 参数：reader_num-要删除读者的编号/
//返回值：删除的记录数目
    public int delete_reader(String reader_num){
        //定义SQLiteDatabase对象实例
        SQLiteDatabase sqLiteDatabase=getWritableDatabase();
        //调用SqLiteDatabase对象的delete方法实现从数据库的readers表中删除数据
        // 返回删除记录的数目
         int result=sqLiteDatabase.delete("readers","reader_number=?",new String[]{reader_num});//精确匹配读者编号作为删除条件
        // 关闭数据库连接
        sqLiteDatabase.close();//返回删除记录的数目
         return result;
    }

    //更新读者信息
//参数：reader-要修改的读者信息
// 按照读者编号找到读者，其余属性按对象中的指定的值改变
// 返回值：更新的记录数目
//
    public int update_reader(Reader reader){//定义SQLiteDatabase对象实例
            SQLiteDatabase sqLiteDatabase=getWritableDatabase();//取出读者编号，将作为更新的条件
        String reader_num=reader.getReader_number();//用参数中提供的reader对象构造ContentValues对象values，用作为修改的值
         ContentValues values=new ContentValues();
        values.put("reader_name",reader.getReader_name());
        values.put("reader_type",reader.getReader_type());
        values.put("reader_phone",reader.getReader_phone());
        values.put("reader_createtime",reader.getReader_createtime());
        values.put("reader_password",reader.getReader_password());//调用SqLiteDatabase对象的update方法实现更新操作
        int result=sqLiteDatabase.update("readers",values,//更新为values
                 "reader_number=?",
                new String[]{reader_num});//精确匹配读者编号作为更新条件
        // 关闭数据库连接
        sqLiteDatabase.close();
        //返回更新的记录数目
         return result;
         }
        //查询读者信息:以读者为关键字查询
        // 参数：reader_num-要删除的读者号
        // 返回值：查询得到的cursor；若不存在该读者，返回null

        @SuppressLint("Range")
        public Cursor query_reader(String reader_num){//定义SQLiteDatabase对象实例
            SQLiteDatabase sqLiteDatabase=getReadableDatabase();
            //调用SqLiteDatabase对象的query方法实现查询操作
            // 查询条件中用LIKE匹配"%"+reader_num+"%"条件，查询中编号中含参数所给值的记录
            Cursor cursor=sqLiteDatabase.query("readers",null,"reader_numberLIKE?",                           new String[]{"%"+reader_num+"%"},null,null,null,null);
            //对于查询操作，由于返回的curso仍然要用到数据库的连接，不作关闭处理
            // 这实际上会对系统效率造成此处可接受的不良影响//
            sqLiteDatabase.close();
            //返回查询得到的游标cursor，待返回后由调用者处理
             return cursor;
        }
        //其后可以继续定义针对图书表、借阅表的方法，以支持相关应用//......//重载onUpgrade，可以为空，但必须有


    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}
